section.section
  header.section__header
    h3#method-isEmail.section__h3 isEmail(val)
  div.section__content
    dl.section__dl
      dt.section__dt Since：
      dd.section__dd 0.2.0
    h4.section__h4 Description
    p isEmail(val) 方法用来检测测试数据是否为合法的 Email 格式。
    h4.section__h4 Parameters
    h5.section__h4 val
    dl.section__dl
      dt.section__dt Type：
      dd.section__dd Any
    p （必须）要检测的数据。
    h4.section__h4 Returns
    dl.section__dl
      dt.section__dt Type：
      dd.section__dd Boolean。
    p 'val' 是正确 Email 格式字符串，返回 true，否则返回 false。
    pre.section__pre
      code.section__code.
        import Types from '@yaohaixiao/types.js'
        // 或者单独引用 isEmail() 方法
        // import isEmail from '@yaohaixiao/types.js/isEmail'

        Types.isEmail('yaohaixiao@gmail.com') // => true
        Types.isEmail('yaohaixiao@gmail.c') // => true
        Types.isEmail('haixiao-yao@gmail.com') // => true
        Types.isEmail('haixiao_yao@gmail.com') // => true
        Types.isEmail('haixiao&yao@gmail.com') // => true
        Types.isEmail('haixiao~yao@gmail.com') // => true
        Types.isEmail('haixiao+yao@gmail.com') // => true
        Types.isEmail('haixiao^yao@gmail.com') // => true
        Types.isEmail('haixiao%yao@gmail.com') // => true
        Types.isEmail('haixiao$yao@gmail.com') // => true
        Types.isEmail('haixiao.yao@gmail.com') // => true
        Types.isEmail('haixiao/yao@gmail.com') // => true
        Types.isEmail('haixiao#yao@gmail.com') // => true
        Types.isEmail('yao{haixiao@gmail.com') // => true
        Types.isEmail('yao|haixiao@gmail.com') // => true
        Types.isEmail('yao}haixiao@gmail.com') // => true

        Types.isEmail('yaohaixiao#gmail.com') // => false
        Types.isEmail('yao\haixiao@gmail.com') // => false
        Types.isEmail('yao[haixiao@gmail.com') // => false

    h4.section__h4 验证 Email 格式的正则表达式
    P 没有能够完美校验 Email 格式的正则表达式，以下几个示例是笔者找到的相对校验规则比较严谨的正则表达式，需要的朋友可以根据自己的需要选取使用。
    pre.section__pre
      code.section__code.
        // Types.js
        const patternTypeJs = /^([a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)$/

        // W3C
        const patternW3C = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

        // JavaScript
        const patternJs = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

        // RFC 5322 Official Standard
        const patternRFC5322 = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/
